﻿using System.Collections.ObjectModel;

namespace Jim.K3Cloud;

/// <summary>
/// 获取单据转换规则
/// </summary>
[Sdk("Kingdee.BOS.ServiceFacade.ServicesStub.Metadata.MetadataService.GetConvertRules", "获取单据转换规则")]
public class K3CloudGetConvertRulesRequest : ISdkRequest<K3CloudGetConvertRulesResponse>
{
    public string SourceFormID { get; set; }
    public string TargetFormID { get; set; }

    public void Validate()
    {
    }
}

public class K3CloudGetConvertRulesResponse : SdkResponse<List<K3CloudConvertRuleElement>>
{
}

/// <summary>转换规则（模板）</summary>
public class K3CloudConvertRuleElement
{

    /// <summary>返回/设置源单据的FormID</summary>
    public string SourceFormId { get; set; }

    /// <summary>返回/设置目标单据的FormId</summary>
    public string TargetFormId { get; set; }

    /// <summary>状态:启用/停用</summary>
    public bool Status { get; set; }

    /// <summary>状态:启用/停用</summary>
    public bool IsDefault { get; set; }

    /// <summary>运行时隐藏</summary>
    public bool Invisible { get; set; }

    /// <summary>是否GUID编码</summary>
    [DefaultValue(true)]
    public bool IsRandom { get; set; }

    /// <summary>允许自由下推，不受流程图控制</summary>
    /// <remarks>
    /// 1. 通常选定了流程图的上游单据，如果要下推到目标单，此单必须在流程图上有；
    /// 2. 此属性为true后，即使在流程图上没有，也允许下推；
    /// 3. 用来解决一些后台自动生成单据，或者变更单的下推需求；此类需求不画在流程图上
    /// </remarks>
    public bool FreePush { get; set; }

    /// <summary>启用时，检查关联配置</summary>
    [DefaultValue(true)]
    public bool CheckLinkSet { get; set; }

    /// <summary>模版表达式，根据表达式判断源单到目标单走哪条路经</summary>
    public string Formula { get; set; }

    /// <summary>下推启动条件</summary>
    public string PushRunCondition { get; set; }

    /// <summary>下推启动条件（解释）</summary>
    public string PushRunConditionExt { get; set; }

    /// <summary>单据转换类型</summary>
    [DefaultValue(0)]
    public int ConvertType { get; set; }

    /// <summary>返回所有的策略</summary>
    public Collection<K3CloudConvertPolicyElement> Policies { get; set; }

    /// <summary>返回当前模板(规则)所在的转换路径。</summary>
    public K3CloudConvertPathElement Path { get; set; }

    [JsonIgnore]
    public object Parent { get; set; }

    [JsonIgnore]
    [Obsolete("属性废弃，不要设置该属性，可能会导致内存不释放。")]
    public FormMetadata SourceFormMetadata { get; set; }

    [Obsolete("属性废弃，不要设置该属性，可能会导致内存不释放。")]
    [JsonIgnore]
    public FormMetadata TargetFormMetadata { get; set; }

    /// <summary>是否相同的开发商</summary>
    [JsonIgnore]
    public bool IsSameKIV { get; set; }

    /// <summary>携带失败时返回警告提示</summary>
    [DefaultValue(false)]
    public bool EnabledTakeFailTip { get; set; }
}

/// <summary>
/// 转换策略
/// </summary>
public abstract class K3CloudConvertPolicyElement
{
    /// <summary>转换策略类的全名称</summary>
    public string ConvertPolicyTypeName { get; }

    /// <summary>返回当前策略所在的模板。</summary>
    public K3CloudConvertRuleElement Rule { get; set; }

    public object Parent { get; set; }

    /// <summary>循序号</summary>
    public virtual int OrderNo { get; set; }
}


/// <summary>转换路径元素</summary>
public class K3CloudConvertPathElement
{
    /// <summary>返回/设置源单据的FormID</summary>
    public string SourceFormId { get; set; }

    /// <summary>返回/设置目标单据的FormId</summary>
    public string TargetFormId { get; set; }

    /// <summary>
    /// 在目标单据中，需要一张表来记录每行数据是通过那个规则，那个单据转换过来的
    /// 目标单中通过该表，找到数据使用的追踪表，再根据追踪表可以找到数据的来源
    /// 保存该表的表名
    /// </summary>
    public string TargetLogFromTable { get; set; }

    /// <remarks>
    /// 在源单据中，需要一张表来记录每行数据是通过那个规则，转换到那个单据去的
    /// 目标单中通过该表，找到数据使用的追踪表，再根据追踪表可以找到数据的去向
    /// 保存该表的表名
    /// </remarks>
    public string SourceLogToTable { get; set; }

    /// <summary>规则集合</summary>
    public Collection<K3CloudConvertRuleElement> Rules { get; set; }

    /// <summary>返回所有的字段选项</summary>
    public Collection<K3CloudFieldOptionElement> FieldOptions { get; set; }

}

/// <summary>字段选项</summary>
public class K3CloudFieldOptionElement
{
    /// <summary>返回/设置 转换后的目标字段</summary>
    public string TargetFieldKey { get; set; }

    /// <summary>是否允许修改</summary>
    public bool IsCanEdit { get; set; }

    /// <summary>是否过滤</summary>
    public bool IsFilter { get; set; }
}



/// <summary>表单元数据对象</summary>
public class FormMetadata
{

    /// <summary>业务元数据</summary>
    public K3CloudBusinessInfo BusinessInfo { get; set; }

    /// <summary>布局全列表(专用于XML序列化)</summary>
    /// <returns></returns>
    /// ]
    public List<K3CloudLayoutInfo> LayoutInfos { get; set; }

    /// <summary>唯一标识</summary>
    public string Id { get; set; }

    /// <summary>领域模型类型</summary>
    public int ModelTypeId { get; set; }

    /// <summary>子领域模型类型</summary>
    public int ModelTypeSubId { get; set; }

    /// <summary>所在子系统Id</summary>
    public string SubSystemId { get; set; }

    /// <summary>名称</summary>
    public LocaleValue Name { get; set; }

}


/// <summary>窗体布局信息</summary>
public class K3CloudLayoutInfo
{

    /// <summary>是否运行时</summary>
    public bool IsRuntime { get; set; }

    /// <summary>布局编码</summary>
    public string Id { get; set; }

    /// <summary>布局标示</summary>
    public string Key { get; set; }

    /// <summary>对应的业务对象编码</summary>
    public string FormId { get; set; }

    /// <summary>本布局标签</summary>
    public string Caption { get; set; }
}




/// <summary>New DTO处理，主要针对WebApi请求参数构建。</summary>
/// <summary>元数据和动态实体构造相关的处理逻辑</summary>
/// <summary>业务对象业务元数据</summary>
[Serializable]
public class K3CloudBusinessInfo
{


    /// <summary>获取全部实体列表</summary>
    public List<K3CloudEntity> Entrys { get; set; }

    /// <summary>是否运行时</summary>
    public bool IsRuntime { get; set; }

    /// <summary>
    /// 节选业务对象字段排序后产生的key组合字符串；
    /// 1. 标明本对象是其他对象的节选；
    /// 2. 本属性值可作为缓存的标示，与其他节选对象进行区分
    /// </summary>
    public string SubBusinessInfoSectionKeys { get; set; }
}



/// <summary>声明了一个实体的元数据定义</summary>
/// <remarks>这里指的是实体的定义，而不是实体的数据。</remarks>
[Serializable]
public class K3CloudEntity
{
    /// <summary>Entity.EntityType的备选值之一，表示实体定义是一个：表头（又称主表、单头）</summary>
    public const int HEAD_TYPE = 0;
    /// <summary>Entity.EntityType的备选值之一，表示实体定义是一个：表体（又称分录、单身、明细）</summary>
    public const int ENTRY_TYPE = 1;
    /// <summary>
    /// Entity.EntityType的备选值之一，表示实体定义是一个：关联表体（关联时自动生成,单据界面隐藏）
    /// </summary>
    public const int LINK_TYPE = 2;
    /// <summary>常量，表示表的前缀，目前是"t"。</summary>
    public const string ALIAS_PREFIX = "t";

    /// <summary>数据源架构类型</summary>
    [DefaultValue(0)]
    public int SchemaType { get; set; }

    /// <summary>返回此实体定义的所有字段项</summary>
    public List<K3CloudFieldData> Fields { get; set; }

    /// <summary>主键类型</summary>
    public Type PkFieldType { get; set; }
    /// <summary>返回/设置 对应到ORM中实体类型的名称</summary>{ get; set; }
    public string EntryName { get; set; }

    /// <summary>分录主键字段名</summary>
    public string EntryPkFieldName { get; set; }

    /// <summary>返回/设置 此实体在集合中的顺序编号</summary>
    public int Seq { get; set; }

    /// <summary>同步Es的日志表(从配置获取,不存储)</summary>
    public string EsLogTable { get; set; }

    /// <summary>从配置获取</summary>
    public string CvpRelationTable { get; set; }

    public string CvpRelationTableL { get; set; }

    /// <summary>返回此实体映射的表对应的名称</summary>
    public string TableName { get; set; }

    /// <summary>返回/设置 表示数据顺序的字段名称。</summary>
    /// <remarks>
    /// 在表体中，允许定义一个列记录表体数据的顺序编号（就是在界面上表体表格最左侧可能看见的顺序编号列），
    /// 如果存在此功能，此属性指向了此字段的名称。
    /// </remarks>
    public string SeqFieldKey { get; set; }

    /// <summary>拆分源单实体内码字段</summary>
    public string SrcEntityDisaFieldKey { get; set; }

    /// <summary>分组列信息</summary>
    public K3CloudGroupColumnInfo GroupColumnInfo { get; set; }

    /// <summary>实体服务规则</summary>
    public List<K3CloudEntityServiceRule> EntityServiceRules { get; set; }

    /// <summary>返回/设置 当创建表体实体时，缺省创建的行数量。</summary>
    /// <remarks>
    /// 这是来自于一个界面需求，例如新建订单后，表体希望自动已经创建了多行。当保存时
    /// 会将空白的行删除。
    /// </remarks>
    [DefaultValue(1)]
    public int DefaultRows { get; set; }

    /// <summary>返回表的别名，目前的实现是 "t" + 顺序编号</summary>
    /// <remarks>此功能用于序事簿上自动为表创建别名。（张利军2010-1-18解答）</remarks>
    public string TableAlias { get; set; }

    /// <summary>返回/设置是否必须录入，如果为非0，表示必须录入</summary>
    public int MustInput { get; set; }

    /// <summary>返回实体的类型，单分录/多分录。</summary>
    public virtual int EntityType { get; set; }

    /// <summary>拆分表列表</summary>
    public List<K3CloudSplitTable> SplitTables { get; set; }

    /// <summary>实体在默认列表中是否显示, 默认不显示</summary>
    [DefaultValue(0)]
    public int ListDefaultShow { get; set; }

    /// <summary>绑定表单服务时使用的分类</summary>
    public int BusinessServiceType { get; set; }

    /// <summary>实体对应的物理表格字段描述</summary>
    /// <remarks>
    /// 如果实体没有对应到物理表格，则为null;
    /// 使用范围：随时检索某具体字段是否存在、字段类型等
    /// </remarks>
    public K3CloudEntityTableSchema EntityTableSchema { get; set; }

    /// <summary>动态实体对象</summary>
    public K3CloudDynamicObjectType DynamicObjectType { get; set; }

    /// <summary>动态实体属性，与主分录动态实体进行关联</summary>
    public K3CloudDynamicProperty DynamicProperty { get; set; }

    /// <summary>Seq字段的动态实体属性</summary>
    public K3CloudDynamicProperty SeqDynamicProperty { get; set; }

    /// <summary>拆分源单实体内码字段的动态实体属性</summary>
    public K3CloudDynamicProperty SrcDisaEntityDynamicProperty { get; set; }
}



/// <summary>描述一个字段的元数据定义</summary>
[Serializable]
public class K3CloudFieldData
{
    /// <summary>
    /// 功能控制最大值，采用16位二进制表示；最大值表示全可用，为65535 = 二进制(1111 1111 1111 1111)
    /// </summary>
    public static readonly int MAXFUNCONTROL;
    /// <summary>掩码_允许多选: 指基础资料F8多选返回</summary>
    public static readonly int FUNCONTROL_MULTI;
    /// <summary>掩码_允许导入字段</summary>
    public static readonly int FUNCONTROL_IMPORT_FIELD;
    /// <summary>掩码_允许导出字段模板</summary>
    public static readonly int FUNCONTROL_EXPORT_FIELD_TEMPLATE;
    /// <summary>
    /// 用于计算“是否允许复制”这个功能的掩码，
    /// 字段是否支持复制，更方便的方法是直接访问 Field.IsCopyControl属性获取。
    /// </summary>
    public static readonly int FUNCONTROL_COPY;
    /// <summary>掩码_默认导出字段模板</summary>
    public static readonly int FUNCONTROL_DEFAULT_EXPORT_FIELD_TEMPLATE;
    /// <summary>掩码_允许参与交叉分析表</summary>
    public static readonly int FUNCONTROL_CROSS_REPORT;
    /// <summary>掩码_连续新增携带</summary>
    public static readonly int FUNCONTROL_SERIES_NEW_TOTE;
    /// <summary>掩码_允许批量填充</summary>
    public static readonly int FUNCONTROL_BATCHFILL;
    /// <summary>掩码_允许批量修改</summary>
    public static readonly int FUNCONTROL_BULK_EDIT;
    /// <summary>掩码_允许单据转换携带</summary>
    public static readonly int FUNCONTROL_CONVERT_TOTE;
    /// <summary>不确定的最小值占位符号</summary>
    public static readonly string DATASCOPE_MIN;
    /// <summary>不确定的最大值占位符号</summary>
    public static readonly string DATASCOPE_MAX;

    public int Tabindex { get; set; }

    /// <summary>返回/设置是否触发字段更新事件</summary>
    public int FireUpdateEvent { get; set; }

    /// <summary>返回/设置此字段的相关安全上下文信息。</summary>
    /// <remarks>此功能将移动到派生类中。（张利军2010-1-18解答）</remarks>
    public string Permission { get; set; }

    /// <summary>返回/设置此字段的缺省值，注意此缺省值使用了字符串描述</summary>
    public virtual K3CloudDefaultValue DefValue { get; set; }

    /// <summary>返回/设置 此字段在ORM中的映射，即在ORM实体中通过什么属性获取其值。</summary>
    public string PropertyName { get; set; }

    /// <summary>返回/设置 此字段的上级控制字段。</summary>
    /// <remarks>
    /// <para>在某些业务处理中，某个字段的选择范围是受另外一个字段的影响的。下面是几个典型的例子：</para>
    /// <para>当选择 县/市 字段的值时，其范围受限于 省 字段；</para>
    /// <para>金额字段的精度，取决于 币别 这个字段。</para>
    /// <para>选择 基础资料 数据时，其能够选择的内容范围取决于 组织。</para>
    /// </remarks>
    public virtual string ControlFieldKey { get; set; }

    /// <summary>返回/设置此字段所属实体的名称(TODO:是否应该改为 Entity Entity{get;})</summary>
    [DefaultValue("FBillHead")]
    public string EntityKey { get; set; }

    /// <summary>返回/设置字段在数据库中的名称</summary>
    public virtual string FieldName { get; set; }

    /// <summary>字段存储于数据库的数据类型</summary>
    public virtual int FieldType { get; set; }

    /// <summary>数据库存储类型</summary>
    [DefaultValue(0)]
    public virtual int DatabaseType { get; set; }

    /// <summary>返回此字段关于数据范围的描述字符串</summary>
    /// <remarks>
    /// <para>此字符串一般由两个部分组成，使用逗号隔开。第一个部分描述了最小值，第二个是最大值。</para>
    /// <para>在DecimalField中使用到此功能，分别存储minValue和maxValue.</para>
    /// <para>在TextFieldAppearance中用于存储minLength和maxLength</para>
    /// <para>此属性值可能被[]包围，需特别去掉</para>
    /// </remarks>
    public string DataScope { get; set; }


    public int MaxDataScope { get; set; }

    public int MinDataScope { get; set; }



    /// <summary>返回此字段关联的所有 Update 事件相关的动作元素</summary>
    public List<K3CloudFormBusinessService> UpdateActions { get; set; }

    /// <summary>过滤条件比较符类型</summary>
    public virtual string ConditionType { get; set; }

    /// <summary>过滤条件默认比较符</summary>
    public virtual string DefaultCondition { get; set; }

    /// <summary>后缀</summary>
    public string Suffix { get; set; }

    /// <summary>返回/设置是否必须录入，如果为非0，表示必须录入</summary>
    public int MustInput { get; set; }

    /// <summary>表名</summary>
    public virtual string TableName { get; set; }

    /// <summary>返回此字段是否必须录入</summary>
    public bool IsMustInput() => this.MustInput != 0;

    /// <summary>返回/设置 在自动创建的序事簿中，其默认的位置</summary>
    [DefaultValue(1)]
    public int ListTabIndex { get; set; }

    /// <summary>返回/设置 在查询条件面板中，此字段出现的位置</summary>
    public int QkQueryTabIndex { get; set; }


    /// <summary>显示顺序</summary>
    public int DisplayOrder { get; set; }

    /// <summary>
    /// 功能控制；
    /// 由于前期设计会存在如下问题：
    /// （1）如果以前功能控制的值是－1，计算后没问题；
    /// （2）如果是某个值，如1+2+4+16，有问题了，因为以后再加的值不存在这个值中；（领域绝大部分都这样）；
    /// （3）如果是2147483647也没问题；
    /// 鉴于以上原因，另外再设计一个可见性字段VisibleExt；
    /// 其类型为string，格式11101101111的形式；1表示可用，0表示不可用；
    /// 其判断逻辑详见GetFunControlExtValue(BOSEnums.Enu_FunControlExtIndex funControl)；
    /// 本属性的占位记录，如果新增了一项，请在枚举Enu_FunControlExtIndex中补充；
    /// </summary>
    [DefaultValue("")]
    public virtual string FunControlExt { get; set; }
    /// <summary>
    /// 功能控制扩展不可编辑的功能
    /// 其类型为string，格式11101101111的形式；1表示不可编辑，0表示可以；
    /// </summary>
    [DefaultValue("")]
    public virtual string FunControlExtendEdit { get; set; }

    /// <summary>返回/设置 功能控制的值</summary>
    [DefaultValue(62591)]
    public virtual int FunControl { get; set; }

    /// <summary>返回/设置 功能控制选项的编辑控制</summary>
    /// <remarks>默认全部选项均可编辑；各字段可以根据需要排出某些选项，以锁定选择控件</remarks>
    public int EnabledFunControl { get; set; }

    /// <summary>字段的默认功能控制；</summary>
    /// <remarks>派生类通过重载本属性，修改默认的功能控制</remarks>
    protected virtual int DefaultFunControl => 62591;

    /// <summary>业务服务对象类型</summary>
    public int BusinessServiceType { get; set; }

    /// <summary>字段对应的实体描述</summary>
    public K3CloudEntity Entity { get; set; }

    /// <summary>字段对应的动态实体上的动态属性</summary>
    public K3CloudDynamicProperty DynamicProperty { get; set; }

    /// <summary>SHA256动态属性</summary>
    public K3CloudDynamicProperty ShaDynamicProperty { get; set; }

    /// <summary>字段是否加密存储</summary>
    public bool FieldEncrty { get; set; }

    public int FieldEncryptionType { get; set; }

    public string SecretKey { get; set; }

    public bool EnableSha { get; set; }

    /// <summary>哈希字段名</summary>
    public string ShaFieldName { get; set; }

    /// <summary>哈希属性名</summary>
    public string ShaPropertyName { get; set; }

    public string CvpProviderId { get; set; }

    /// <summary>该字段的控制字段，在BusinessInfo的反序列化填充</summary>
    public K3CloudFieldData ControlField { get; set; }

    /// <summary>被该字段控制的字段列表</summary>
    public List<K3CloudFieldData> ChildrenFields { get; set; }

    public bool EnableCvpInfo { get; set; }

    /// <summary>脱敏方案</summary>
    public K3CloudCvpMkSchemeMeta CvpMkScheme { get; set; }

    /// <summary>脱敏类型</summary>
    public string CvpMkTypeId { get; set; }
}

/// <summary>元素缺省值基类</summary>
public class K3CloudDefaultValue
{
    /// <summary>简单类型缺省值</summary>
    public string Value { get; set; }
}

/// <summary>表单业务服务元数据对象</summary>
[Serializable]
public class K3CloudFormBusinessService
{
    /// <summary>类型是操作(ActionId:23)</summary>
    public const int ACTION_CallBillFunction = 23;
    /// <summary>计算定义公式的值并填写到指定列</summary>
    public static readonly int ACTION_Calculate;
    /// <summary>携带当前字段相关基础资料属性到指定列</summary>
    public static int ACTION_TakeBaseData;

    /// <summary>禁止修改</summary>
    [DefaultValue(0)]
    public int ForbitEdit { get; set; }

    /// <summary>Action的预定配置，存储适用范围等信息</summary>
    public int Type { get; set; }

    /// <summary>前置条件表达式</summary>
    [DefaultValue("")]
    public string PreCondition { get; set; }

    /// <summary>前置条件表达式</summary>
    public LocaleValue PreConditionDesc { get; set; }


    /// <summary>确认信息</summary>
    public LocaleValue ConfirmInfo { get; set; }

    /// <summary>运行时类名</summary>
    public string ClassName { get; set; }

    /// <summary>下推/选单运行时类名</summary>
    /// <remarks>下推/选单，数据处理在服务端运行，因此，其运行类不能直接采用标准的运行类，需要单独实现</remarks>
    public string PushClassName { get; set; }

    /// <summary>服务执行时机点:参考BOSEnums.Enu_ServiceActionPoint</summary>
    public int ActionPoint { get; set; }

    /// <summary>把对象化的参数转换为字符串输出、输入(专用于XML序列化)</summary>
    [JsonIgnore]
    public string Parameters { get; set; }

    /// <summary>表单服务Id</summary>
    public virtual long ActionId { get; set; }

    /// <summary>表单服务名称</summary>
    public string Name { get; set; }

    /// <summary>表单服务描述</summary>
    public LocaleValue Description { get; set; }

    /// <summary>服务是否启用</summary>
    [DefaultValue(true)]
    public bool IsEnabled { get; set; }

    /// <summary>操作/服务是否禁用（BOS IDE勾选指定）</summary>
    [DefaultValue(false)]
    public bool IsForbidden { get; set; }

    /// <summary>不执行此服务的单据转换规则ID, 逗号分隔</summary>
    public string ExcludedRuleIds { get; set; }

    /// <summary>表单服务参数语法</summary>
    public string Syntax { get; set; }


    /// <summary>表单服务配置组件</summary>
    public string SetComponent { get; set; }

    /// <summary>表单服务参数重构组件</summary>
    public string ReverseActionClass { get; set; }

    /// <summary>配置信息</summary>
    public string Setting { get; set; }

    /// <summary>服务绑定的目标元素Key</summary>
    public string ObjectKey { get; set; }

    /// <summary>顺序</summary>
    public int Seq { get; set; }

    /// <summary>返回此服務當前嵌入在哪個規則下。</summary>
    /// <remarks>
    /// <para>什麽是RuleId?</para>
    /// <para>當一個服務被添加到一個“實體服務規則”后，RuleId就是這個“實體服務規則”的編號。</para>
    /// <para>爲什麽需要記錄RuleId？</para>
    /// <para>對於同一個規則下的鎖定和解鎖，其對應的表决器應該一致，而對於不同的規則，其對應的表决器應該是不同的，
    /// 通過傳入規則編號，以便區分不同的表决器。</para>
    /// </remarks>
    public string RuleId { get; set; }

    /// <summary>返回當前服務在什麽時機點下觸發，默認是 值更新、明細重置和集合重置。</summary>
    public virtual K3CloudRaiseEventType RaiseEventType { get; set; }

    /// <summary>返回此服务的缺省触发类型，他通过FormBusinessServiceType在数据库中的字段填充。</summary>
    public K3CloudRaiseEventType DefaultRaiseEventType { get; set; }

    /// <summary>是否在ItemAdded時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseItemAdded { get; set; }

    /// <summary>是否在ValueChanged時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseValueChanged { get; set; }

    /// <summary>引入禁用（含webapi）</summary>
    [DefaultValue(false)]
    public bool ImportDisabled { get; set; }

    /// <summary>是否在Initialized時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseInitialized { get; set; }

    /// <summary>是否在ItemReset時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseItemReset { get; set; }

    /// <summary>是否在ItemRemoved時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseItemRemoved { get; set; }

    /// <summary>是否在Reset時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseReset { get; set; }

    /// <summary>是否在SelectRowChanged時觸發服務的執行。</summary>
    public K3CloudServiceRaiseMode RaiseSelectRowChanged { get; set; }

    /// <summary>是否在SelectRowChanged時觸發服務的執行。(行选择类型读取现在这个值，为了兼容以前的)</summary>
    public K3CloudServiceRaiseMode RaiseSelectRowExtChanged { get; set; }

    /// <summary>id号，以便于XML中进行差量化比较</summary>
    public string Id { get; set; }
}

/// <summary>
/// 脱敏方案
/// </summary>
public class K3CloudCvpMkSchemeMeta
{
    /// <summary>脱敏类型</summary>
    public string MkType { get; set; }

    /// <summary>表单脱敏方式</summary>
    public string MkForm { get; set; }

    /// <summary>打印脱敏方式</summary>
    public string MkPrint { get; set; }

    /// <summary>引出脱敏方式</summary>
    public string MkExport { get; set; }

    /// <summary>webapi脱敏方式</summary>
    public string MkWebAPI { get; set; }
}
/// <summary>分组列信息</summary>
public class K3CloudGroupColumnInfo
{

    /// <summary>数据标示</summary>
    public virtual string Id { get; set; }

    /// <summary>分组列</summary>
    public List<K3CloudGroupColumn> GroupColumns { get; set; }

    /// <summary>分组小计列</summary>
    public List<K3CloudGroupSubColumn> GroupSubColumns { get; set; }

    /// <summary>分组合计列</summary>
    public List<K3CloudGroupSumColumn> GroupSumColumns { get; set; }

}

/// <summary>分组列</summary>
public class K3CloudGroupColumn
{
    /// <summary>字段Key</summary>
    public string FieldKey { get; set; }
}

/// <summary>分组小计列</summary>
public class K3CloudGroupSubColumn
{
    /// <summary>字段Key</summary>
    public string FieldKey { get; set; }

    /// <summary>小计类型</summary>
    public int SubType { get; set; }

    /// <summary>是否支持金额大写</summary>
    public bool EnableAmountInWords { get; set; }
}
/// <summary>分组合计列</summary>
public class K3CloudGroupSumColumn
{
    /// <summary>字段Key</summary>
    public string FieldKey { get; set; }

    /// <summary>合计类型</summary>
    public int SumType { get; set; }

    /// <summary>是否支持金额大写</summary>
    public bool EnableAmountInWords { get; set; }

    [DefaultValue(-1)]
    public int Precision { get; set; }
}

/// <summary>实体服务规则</summary>
public class K3CloudEntityServiceRule
{

    /// <summary>编码</summary>
    public string Id { get; set; }

    /// <summary>规则描述</summary>
    public LocaleValue Description { get; set; }

    /// <summary>实体服务规则是否可用</summary>
    [DefaultValue(true)]
    public bool IsEnabled { get; set; }

    /// <summary>条件表达式</summary>
    public string PreCondition { get; set; }

    /// <summary>条件表达式描述</summary>
    public LocaleValue PreConditionDesc { get; set; }

    /// <summary>返回/设置此实体服务规则的执行顺序。</summary>
    [DefaultValue(0)]
    public int Seq { get; set; }

    /// <summary>条件成立时，服务集合</summary>
    public K3CloudFormBusinessServiceCollection WhenTrueBusinessServices { get; set; }

    /// <summary>条件不成立时，服务集合</summary>
    public K3CloudFormBusinessServiceCollection WhenFalseBusinessServices { get; set; }

}

[Serializable]
public sealed class K3CloudFormBusinessServiceCollection : Collection<K3CloudFormBusinessService>
{
}



/// <summary>拆分表</summary>
public class K3CloudSplitTable
{
    /// <summary>后缀</summary>
    public string Suffix { get; set; }
    public LocaleValue Description { get; set; }
}

/// <summary>实体物理表格描述</summary>
[Serializable]
public class K3CloudEntityTableSchema
{
    public Dictionary<string, K3CloudEntityFieldSchema> Fields { get; set; }

    /// <summary>缓存的版本号，通常与对应的元数据版本一致，不一致需要重建</summary>
    public string Version { get; set; }

}


/// <summary>
/// DynamicObjectType允许在运行时动态构建一个实体类型，而不需要在设计时预先定义好实体类型。
/// </summary>
/// <remarks>
///  </remarks>
[Serializable]
public class K3CloudDynamicObjectType
{

    /// <summary>返回实体类型的名称</summary>
    public string Name { get; set; }

    /// <summary>
    /// 扩展名称；类型名称与各属性名合并组成的字符串；
    /// 以此快速比对两个类型是否一致，作为缓存Region标识
    /// </summary>
    public string ExtendName { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public K3CloudDataEntityCacheType CacheType { get; set; }

    /// <summary>Es log同步表</summary>
    public string EsLogTable { get; set; }

    public string CvpRelationTable { get; set; }

    /// <summary>是否禁用缓存</summary>
    public bool IsDisableCache { get; set; }

    /// <summary>数据源架构类型</summary>
    public K3CloudDataSourceSchemaType SchemaType { get; set; }

    /// <summary>返回所有的属性</summary>
    public object Properties { get; set; }

    /// <summary>主键</summary>
    public K3CloudDynamicProperty PrimaryKey { get; set; }


    /// <summary>返回此实体类型特征，可选值包括：Class(缺省)、Abstract、Sealed、Interface</summary>
    public K3CloudDataEntityTypeFlag Flag { get; set; }
}


/// <summary>动态属性的基类,对实体字段值的操作是通过它来完成的.</summary>
/// <example>
/// <code>
/// //注册一个动态属性
/// DynamicProperty SheetDateProperty = saleOrderType.RegisterProperty("SheetDate", typeof(DateTime),new DateTime(2009,9,1));
/// //对动态属性读取和设置
/// DynamicObject obj = new DynamicObject(saleOrderType);
/// SaleOrderIDProperty.GetValue(obj); //缺省值0
/// SheetDateProperty.GetValue(obj); //缺省值
/// SaleOrderIDProperty.SetValue(obj, 99);
/// </code>
/// </example>
public class K3CloudDynamicProperty
{

    /// <summary>返回此元数据对象的名称</summary>
    public string Name { get; set; }

    /// <summary>返回属性的返回类型</summary>
    public Type PropertyType { get; set; }

    /// <summary>返回此属性的缺省值</summary>
    public object DefaultValue { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public bool HasDefaultValue { get; set; }

    /// <summary>返回是否只读</summary>
    public bool IsReadOnly { get; set; }

    /// <summary>返回此属性在所在DynamicObjectType上的位置（内部使用，请慎重处理）</summary>
    [ReadOnly(true)]
    public int Ordinal { get; set; }
}


/// <summary>实体物理表格字段描述</summary>
public class K3CloudEntityFieldSchema
{

    /// <summary>字段名</summary>
    public string ColumnName { get; set; }

    /// <summary>字段顺序</summary>
    public int ColumnOrdinal { get; set; }

    /// <summary>字段大小</summary>
    public int ColumnSize { get; set; }

    /// <summary>数值总长</summary>
    public short NumericPrecision { get; set; }

    /// <summary>数值小数位数</summary>
    public short NumericScale { get; set; }

    /// <summary>字段值类型</summary>
    public Type DataType { get; set; }

    /// <summary>字段值类型对应的数据库类型枚举值，如131、202、135等</summary>
    public int ProviderType { get; set; }

    /// <summary>字段是否允许为空</summary>
    public bool AllowDBNull { get; set; }

    public bool IsUnique { get; set; }

    public bool IsKey { get; set; }

    public bool IsAutoIncrement { get; set; }

    public string DefaultValue { get; set; }
}


//public class K3CloudGetConvertRulesData
//{
//    public string SourceFormId { get; set; }
//    public string TargetFormId { get; set; }
//    public string Status { get; set; }
//    public string IsDefault { get; set; }
//    public string Invisible { get; set; }
//    public string IsRandom { get; set; }
//    public string FreePush { get; set; }
//    public string CheckLinkSet { get; set; }
//    public string Formula { get; set; }
//    public string PushRunCondition { get; set; }
//    public string PushRunConditionExt { get; set; }
//    public int ConvertType { get; set; }
//    public List<PoliciesItem> Policies { get; set; }
//    public string EnabledTakeFailTip { get; set; }
//    public List<NameItem> Name { get; set; }
//    public string IsInheritElement { get; set; }
//    public string Id { get; set; }
//    public string Key { get; set; }
//    public string HelpContextId { get; set; }
//    public string OriginKey { get; set; }
//    public int ElementType { get; set; }
//    public int BusinessServiceType { get; set; }
//}


//public class FieldMapsItem
//{
//    public string TargetFieldKey { get; set; }
//    public string TargetFieldName { get; set; }
//    public string SourceFieldKey { get; set; }
//    public string SourceFieldName { get; set; }
//    public int ValueConvertMode { get; set; }
//    public string Formula { get; set; }
//    public string FormulaDesc { get; set; }
//    public string IsFilter { get; set; }
//    public string OnlyAgain { get; set; }
//    public string IsExtendUnEdit { get; set; }
//    public string BreakForNoDistribute { get; set; }
//    public string OnlyTakeApprovedData { get; set; }
//    public string OnlyTakeUsedData { get; set; }
//    public List<string> Name { get; set; }
//    public string IsInheritElement { get; set; }
//    public string Id { get; set; }
//    public string Key { get; set; }
//    public string HelpContextId { get; set; }
//    public string OriginKey { get; set; }
//    public int ElementType { get; set; }
//    public int BusinessServiceType { get; set; }
//}

//public class NameItem
//{
//    public int Key { get; set; }
//    public string Value { get; set; }
//}

//public class PoliciesItem
//{
//    public string SourceEntryKey { get; set; }
//    public string SourceSubEntryKey { get; set; }
//    public string TargetEntryKey { get; set; }
//    public string TargetSubEntryKey { get; set; }
//    public List<FieldMapsItem> FieldMaps { get; set; }
//    public int OrderNo { get; set; }
//    public List<NameItem> Name { get; set; }
//    public string IsInheritElement { get; set; }
//    public string Id { get; set; }
//    public string Key { get; set; }
//    public string HelpContextId { get; set; }
//    public string OriginKey { get; set; }
//    public int ElementType { get; set; }
//    public int BusinessServiceType { get; set; }
//}



